package com.erbao.io.netty.refactor.transport;

import com.erbao.io.netty.refactor.rpc.protocol.MyContent;
import com.erbao.io.netty.refactor.rpc.protocol.MyHeader;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.io.ByteArrayInputStream;
import java.io.ObjectInputStream;
import java.util.List;

public class PkgMsgDecoder extends ByteToMessageDecoder {

    // 父类里一定有channelread { 会有byte buf处理的环绕，decode之后剩余留存 } > byte buf
    @Override
    protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception {
        // 请求的数据，服务端读取
        // System.out.println(" 读取之前，发现可读字节数【"+byteBuf.readableBytes()+"】");
        while (byteBuf.readableBytes() >= MyHeader.BYTES_LENGTH) {// 消息头
            byte[] bytes = new byte[MyHeader.BYTES_LENGTH];
            // byteBuf.readBytes(bytes);// 这种读取方式会移动读指针
            byteBuf.getBytes(byteBuf.readerIndex(), bytes);// 获取数据，不移动指针
            ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
            ObjectInputStream ois = new ObjectInputStream(bais);
            MyHeader header = (MyHeader) ois.readObject();

            // System.out.println(" 读取的请求header：" + header);

            /*读取消息体*/
            if (byteBuf.readableBytes()-MyHeader.BYTES_LENGTH >= header.getContentLength()) {
                // 进入判断，可以获取一个完整请求的数据，需要移动指针
                byteBuf.readBytes(MyHeader.BYTES_LENGTH);

                byte[] contentBytes = new byte[(int) header.getContentLength()];
                byteBuf.readBytes(contentBytes);
                ByteArrayInputStream din = new ByteArrayInputStream(contentBytes);
                ObjectInputStream doin = new ObjectInputStream(din);
                MyContent content = (MyContent) doin.readObject();

                if (header.getFlag() == 0x14141414) {
                    System.out.println("请求数据，server解码中……");
                } else if (header.getFlag() == 0x14141424) {
                    System.out.println("响应数据，client解码中……");
                }

                list.add(new MyPkgMsg(header, content));
                // System.out.println(" 读取的请求内容：" + content);
            } else {
                // System.out.println(" 发现剩余可读大小【" + byteBuf.readableBytes() + "】小于header中显示的content的大小【" + header.getContentLength() + "】");
                break;// 剩余的数据会自动拼接缓存，也就是自动暂存
            }
        }

    }
}
